// /import core
// /import uicore
// /import ui/mask.js
// /import ui/button.js
(function() {
	var utils = baidu.editor.utils, domUtils = baidu.editor.dom.domUtils, uiUtils = baidu.editor.ui.uiUtils, Mask = baidu.editor.ui.Mask, UIBase = baidu.editor.ui.UIBase, Button = baidu.editor.ui.Button, Dialog = baidu.editor.ui.Dialog = function(
			options) {
		this.initOptions(options);
		this.initDialog();
	};
	var modalMask;
	var dragMask;
	Dialog.prototype = {
		draggable : false,
		uiName : 'dialog',
		initDialog : function() {
			var me = this;
			this.initUIBase();
			this.modalMask = (modalMask || (modalMask = new Mask({
						className : 'edui-dialog-modalmask'
					})));
			this.dragMask = (dragMask || (dragMask = new Mask({
						className : 'edui-dialog-dragmask'
					})));
			this.closeButton = new Button({
						className : 'edui-dialog-closebutton',
						title : '关闭对话框',
						onclick : function() {
							me.close(false);
						}
					});
			if (this.buttons) {
				for (var i = 0; i < this.buttons.length; i++) {
					if (!(this.buttons[i] instanceof Button)) {
						this.buttons[i] = new Button(this.buttons[i]);
					}
				}
			}
		},
		fitSize : function() {
			var popBodyEl = this.getDom('body');
			// if (!(baidu.editor.browser.ie && baidu.editor.browser.version ==
			// 7)) {
			// uiUtils.removeStyle(popBodyEl, 'width');
			// uiUtils.removeStyle(popBodyEl, 'height');
			// }
			var size = this.mesureSize();
			popBodyEl.style.width = size.width + 'px';
			popBodyEl.style.height = size.height + 'px';
			return size;
		},
		safeSetOffset : function(offset) {
			var me = this;
			var el = me.getDom();
			var vpRect = uiUtils.getViewportRect();
			var rect = uiUtils.getClientRect(el);
			var left = offset.left;
			if (left + rect.width > vpRect.right) {
				left = vpRect.right - rect.width;
			}
			var top = offset.top;
			if (top + rect.height > vpRect.bottom) {
				top = vpRect.bottom - rect.height;
			}
			el.style.left = Math.max(left, 0) + 'px';
			el.style.top = Math.max(top, 0) + 'px';
		},
		showAtCenter : function() {
			this.getDom().style.display = '';
			var vpRect = uiUtils.getViewportRect();
			var popSize = this.fitSize();
			var titleHeight = this.getDom('titlebar').offsetHeight | 0;
			var left = vpRect.width / 2 - popSize.width / 2;
			var top = vpRect.height / 2 - (popSize.height - titleHeight) / 2
					- titleHeight;
			var popEl = this.getDom();
			this.safeSetOffset({
						left : Math.max(left | 0, 0),
						top : Math.max(top | 0, 0)
					});
			if (!domUtils.hasClass(popEl, 'edui-state-centered')) {
				popEl.className += ' edui-state-centered';
			}
			this._show();
		},
		getContentHtml : function() {
			var contentHtml = '';
			if (typeof this.content == 'string') {
				contentHtml = this.content;
			} else if (this.iframeUrl) {
				contentHtml = '<iframe id="'
						+ this.id
						+ '_iframe" class="%%-iframe" height="100%" width="100%" frameborder="0" src="'
						+ this.iframeUrl + '"></iframe>';
			}
			return contentHtml;
		},
		getHtmlTpl : function() {
			var footHtml = '';
			if (this.buttons) {
				var buff = [];
				for (var i = 0; i < this.buttons.length; i++) {
					buff[i] = this.buttons[i].renderHtml();
				}
				footHtml = '<div class="%%-foot">'
						+ '<div id="##_buttons" class="%%-buttons">'
						+ buff.join('') + '</div>' + '</div>';
			}
			return '<div id="##" class="%%"><div class="%%-wrap"><div id="##_body" class="%%-body">'
					+ '<div class="%%-shadow"></div>'
					+ '<div id="##_titlebar" class="%%-titlebar">'
					+ '<div class="%%-draghandle" onmousedown="$$._onTitlebarMouseDown(event, this);">'
					+ '<span class="%%-caption">'
					+ (this.title || '')
					+ '</span>'
					+ '</div>'
					+ this.closeButton.renderHtml()
					+ '</div>'
					+ '<div id="##_content" class="%%-content">'
					+ (this.autoReset ? '' : this.getContentHtml())
					+ '</div>'
					+ footHtml + '</div></div></div>';
		},
		postRender : function() {
			// todo: 保持居中/记住上次关闭位置选项
			if (!this.modalMask.getDom()) {
				this.modalMask.render();
				this.modalMask.hide();
			}
			if (!this.dragMask.getDom()) {
				this.dragMask.render();
				this.dragMask.hide();
			}
			var me = this;
			this.addListener('show', function() {
						me.modalMask.show();
					});
			this.addListener('hide', function() {
						me.modalMask.hide();
					});
			if (this.buttons) {
				for (var i = 0; i < this.buttons.length; i++) {
					this.buttons[i].postRender();
				}
			}
			domUtils.on(window, 'resize', function() {
						setTimeout(function() {
									if (!me.isHidden()) {
										me.safeSetOffset(uiUtils
												.getClientRect(me.getDom()));
									}
								});
					});
			this._hide();
		},
		mesureSize : function() {
			var body = this.getDom('body');
			var width = uiUtils.getClientRect(this.getDom('content')).width;
			var dialogBodyStyle = body.style;
			dialogBodyStyle.width = width;
			return uiUtils.getClientRect(body);
		},
		_onTitlebarMouseDown : function(evt, el) {
			if (this.draggable) {
				var rect;
				var vpRect = uiUtils.getViewportRect();
				var me = this;
				uiUtils.startDrag(evt, {
							ondragstart : function() {
								rect = uiUtils.getClientRect(me.getDom());
								me.dragMask.show();
							},
							ondragmove : function(x, y) {
								var left = rect.left + x;
								var top = rect.top + y;
								me.safeSetOffset({
											left : left,
											top : top
										});
							},
							ondragstop : function() {
								domUtils.removeClasses(me.getDom(),
										['edui-state-centered']);
								me.dragMask.hide();
							}
						});
			}
		},
		reset : function() {
			this.getDom('content').innerHTML = this.getContentHtml();
		},
		_show : function() {
			if (this._hidden) {
				this.getDom().style.display = '';
				this._hidden = false;
				this.fireEvent('show');
			}
		},
		isHidden : function() {
			return this._hidden;
		},
		_hide : function() {
			if (!this._hidden) {
				this.getDom().style.display = 'none';
				this._hidden = true;
				this.fireEvent('hide');
			}
		},
		open : function() {
			if (this.autoReset) {
				this.reset();
			}
			this.showAtCenter();
			if (this.iframeUrl) {
				try {
					this.getDom('iframe').focus();
				} catch (ex) {
				}
			}
		},
		_onCloseButtonClick : function(evt, el) {
			this.close(false);
		},
		close : function(ok) {
			if (this.fireEvent('close', ok) !== false) {
				this._hide();
			}
		}
	};
	utils.inherits(Dialog, UIBase);
})();
